package dao.impl;

import hibernate.HibernateUtil;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import dao.CotizacionDAO;
import dominio.Cotizacion;

public class CotizacionDAOImpl implements CotizacionDAO {
	
	private static CotizacionDAOImpl instancia = null;
	
	private static SessionFactory sf = null;

	private CotizacionDAOImpl(){}
	
	public static CotizacionDAOImpl getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new CotizacionDAOImpl();
		} 
		return instancia;
	}
	
	
	public Cotizacion findByID(Integer id) {
		Cotizacion cotizacion = new Cotizacion();
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx= session.beginTransaction();
		session.load(cotizacion, id);
		tx.commit();
		session.close();
		return cotizacion;
	}
	
	public void grabarCotizacion(Cotizacion cot){
		Session session = sf.openSession();
		session.beginTransaction();
		session.persist(cot);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}

	@SuppressWarnings("unchecked")
	public List<Cotizacion> getAll() {
		List<Cotizacion> cotizaciones;
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx= session.beginTransaction();
		cotizaciones = session.createQuery("from Cotizacion").list();
		tx.commit();
		session.close();		
		return cotizaciones;
	}

	@Override
	public Cotizacion findUltimaGuardada() {
		Cotizacion cotizacion;
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx= session.beginTransaction();
		cotizacion = (Cotizacion) session.createQuery(
				"select c from Cotizacion c where c.fecha >= all(select c2.fecha from Cotizacion c2)").list().get(0);
		tx.commit();
		session.close();
		return cotizacion;
	}

	@Override
	public void actualizar(Cotizacion cot) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx= session.beginTransaction();
		session.saveOrUpdate(cot);
		tx.commit();
		session.close();
	}

}
